#include "Consulta.h"

Consulta::Consulta(Estacionamiento* estacionamiento, vector<Pipe>* pipesSalidas):
	detectando (true),
	estacionamiento (estacionamiento),
	pipesSalidas (pipesSalidas){

	SignalHandler::getInstance()->registrarHandler(SIGUSR1, this);
	SignalHandler::getInstance()->registrarHandler(SIGINT, this);
	SignalHandler::getInstance()->registrarHandler(SIGTERM, this);

	for (vector<Pipe>::iterator it = pipesSalidas->begin(); it != pipesSalidas->end(); it++){
		it->setearModo(ESCRITURA);
		it->cerrar();
	}

	Log::getInstance()->loguear("Consulta: creada.");
}

Consulta::~Consulta() {
	SignalHandler::getInstance()->removerHandler(SIGUSR1);
	SignalHandler::getInstance()->removerHandler(SIGINT);
	SignalHandler::getInstance()->removerHandler(SIGTERM);
	SignalHandler::destruir();

	Log::getInstance()->loguear("Consulta: destruida.");
}

void Consulta::iniciarDeteccion() {
	char tecla;
	int cantidadAutos, monto;
	
	while(this->detectando){
		tecla = getchar();
		
		if (tecla == TECLA_CANTIDAD){
			cantidadAutos = estacionamiento->consultarCantidadAutos();
			Log::getInstance()->imprimir("La cantidad de autos en el estacionamiento es " + intToString(cantidadAutos) + ".");
			
		} else if (tecla == TECLA_MONTO){
			monto = estacionamiento->consultarMontoFacturado();
			Log::getInstance()->imprimir("El monto facturado hasta el momento es $" + intToString(monto) + ".");
		}
	}
}

/**
 * Handler de señales:
 * SIGUSR1: Señal que envia el terminador para finalizar la simulación.
 * SIGINT: Se ignora. El terminador la toma para iniciar la detención del programa ordenadamente
 * SIGTERM: Se ignora.  El terminador la toma para iniciar la detención del programa ordenadamente
 */
int Consulta::handleSignal(int signum){
	if (signum == SIGUSR1){
		Log::getInstance()->loguear("Consulta: me llego SIGUSR1. Voy a finalizar.");
		this->detectando = false;

	} else if (signum == SIGINT){
		Log::getInstance()->loguear("Consulta: me llego SIGINT. No hago nada.");
		// La señal la toma el terminador para detener la ejecución ordenadamente.

	} else if (signum == SIGTERM){
		Log::getInstance()->loguear("Consulta: me llego SIGTERM. No hago nada.");
		// La señal la toma el terminador para detener la ejecución ordenadamente.

	}
	return 0;
}
